כשאתה מאפשר למישהו להעלות קבצים לשרת שלך – אי אפשר להמעיט בערכה של האבטחה, ולהסתמך רק על סיומת הקובץ זה רעיון גרוע ביותר.
את סוג הקובץ אפשר להבין לפי תוכן הקובץ
כל קובץ (למעט אולי קובץ טקסט רגיל) מכיל בתוכו גם מידע על סוג הקובץ עצמו, כדי שהתוכנה מתאימה תדע איך להציג אותו נכון. סוג הקובץ נקרא באנגלית MIME type.
המידע הזה הרבה יותר אמין מסיומת קובץ, מכיוון שאת הסיומת אפשר לשנות, בלי להמיר את סוג הקובץ.
את ה-MIME אפשר לקרוא מתוך הקובץ
file_info היא הרחבה ל-PHP שהחל מגרסה 5.3 היא מובנית בשפה.
לקבל באמצעותה את סוג ה-MIME של הקובץ אפשר בשני שורות בלבד:
$file = 'someTextFileRenamedToJPG.jpg';
$file_info = new finfo(FILEINFO_MIME);
$mime_type = $file_info->file($file);
echo $mime_type; // text/plain
$file_info = new finfo(FILEINFO_MIME);
$mime_type = $file_info->file($file);
echo $mime_type; // text/plain
במקרה של העלאת תמונות אפשר להשתמש בפונקציה getimagesize()
הפונקציה getimagesize תחזיר false במקרה שהקובץ אינו תמונה. אם זו תמונה, היא תחזיר מערך עם מידע על התמונה, לא משנה באיזו סיומת יהיה הקובץ.
הערה: אם הקובץ לא קיים או שהוא לא תמונה – תיזרק שגיאה.
תגובות לכתבה:
תודה רבה אלכס.
בכיף. מקווה שזה יעזור להגן על אתרים :)
אני רוצה לקבל מהגולש קישור לתמונה, כמובן שעליי לוודא שהקישור שהוא נתן הוא אכן מוביל לתמונה קיימת.
שימוש בgetimagesize יהיה הטוב ביותר ? במקרה שהלינק מוביל לתמונה אמיתית יחזיר TRUE במידה ולא יחזיר FALSE. או שהפונקציה לא עובדת עם לינקים ורק עם תמונות בשרת?
מצטרף לשאלה של ben.
עובדת, הבעיה היחידה היא שהשרת האחר יכול להחזיר תמונה אמיתי כשאתה תנסה לבדוק אותה עם getimagesize ולהחזיר משהו אחר לחלוטין כשזה לא אתה שמנסה לבדוק.
חוץ מזה, קרא את המדריך של cayce על איך הוא פרץ ל phpguide על ידי קישורים של תמונות.
http://phpguide.co.il/איך פרצתי ל phpguide.htm
יש גם דרכים למנוע פריצה כזאת ע"י מה שהסברתי בתגובה שלי למאמר איך פורצים את PHP GUIDE